home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / java / text / RBTableBuilder.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  5.5 KB  |  370 lines

  1. package java.text;
  2.  
  3. import java.util.Vector;
  4. import sun.text.ComposedCharIter;
  5. import sun.text.IntHashtable;
  6. import sun.text.UCompactIntArray;
  7. import sun.text.normalizer.NormalizerImpl;
  8.  
  9. final class RBTableBuilder {
  10.    static final int CHARINDEX = 1879048192;
  11.    private static final int IGNORABLEMASK = 65535;
  12.    private static final int PRIMARYORDERINCREMENT = 65536;
  13.    private static final int SECONDARYORDERINCREMENT = 256;
  14.    private static final int TERTIARYORDERINCREMENT = 1;
  15.    private static final int INITIALTABLESIZE = 20;
  16.    private static final int MAXKEYSIZE = 5;
  17.    private RBCollationTables.BuildAPI tables = null;
  18.    private MergeCollation mPattern = null;
  19.    private boolean isOverIgnore = false;
  20.    private char[] keyBuf = new char[5];
  21.    private IntHashtable contractFlags = new IntHashtable(100);
  22.    private boolean frenchSec = false;
  23.    private boolean seAsianSwapping = false;
  24.    private UCompactIntArray mapping = null;
  25.    private Vector contractTable = null;
  26.    private Vector expandTable = null;
  27.    private short maxSecOrder = 0;
  28.    private short maxTerOrder = 0;
  29.  
  30.    public RBTableBuilder(RBCollationTables.BuildAPI var1) {
  31.       this.tables = var1;
  32.    }
  33.  
  34.    public void build(String var1, int var2) throws ParseException {
  35.       boolean var3 = true;
  36.       boolean var4 = false;
  37.       if (var1.length() == 0) {
  38.          throw new ParseException("Build rules empty.", 0);
  39.       } else {
  40.          this.mapping = new UCompactIntArray(-1);
  41.          var1 = NormalizerImpl.canonicalDecomposeWithSingleQuotation(var1);
  42.          this.mPattern = new MergeCollation(var1);
  43.          int var7 = 0;
  44.  
  45.          for(int var11 = 0; var11 < this.mPattern.getCount(); ++var11) {
  46.             PatternEntry var8 = this.mPattern.getItemAt(var11);
  47.             if (var8 != null) {
  48.                String var6 = var8.getChars();
  49.                if (var6.length() > 1) {
  50.                   switch (var6.charAt(var6.length() - 1)) {
  51.                      case '!':
  52.                         this.seAsianSwapping = true;
  53.                         var6 = var6.substring(0, var6.length() - 1);
  54.                         break;
  55.                      case '@':
  56.                         this.frenchSec = true;
  57.                         var6 = var6.substring(0, var6.length() - 1);
  58.                   }
  59.                }
  60.  
  61.                var7 = this.increment(var8.getStrength(), var7);
  62.                String var5 = var8.getExtension();
  63.                if (var5.length() != 0) {
  64.                   this.addExpandOrder(var6, var5, var7);
  65.                } else if (var6.length() > 1) {
  66.                   char var9 = var6.charAt(0);
  67.                   if (Character.isHighSurrogate(var9) && var6.length() == 2) {
  68.                      this.addOrder(Character.toCodePoint(var9, var6.charAt(1)), var7);
  69.                   } else {
  70.                      this.addContractOrder(var6, var7);
  71.                   }
  72.                } else {
  73.                   char var12 = var6.charAt(0);
  74.                   this.addOrder(var12, var7);
  75.                }
  76.             }
  77.          }
  78.  
  79.          this.addComposedChars();
  80.          this.commit();
  81.          this.mapping.compact();
  82.          this.tables.fillInTables(this.frenchSec, this.seAsianSwapping, this.mapping, this.contractTable, this.expandTable, this.contractFlags, this.maxSecOrder, this.maxTerOrder);
  83.       }
  84.    }
  85.  
  86.    private void addComposedChars() throws ParseException {
  87.       ComposedCharIter var1 = new ComposedCharIter();
  88.  
  89.       int var2;
  90.       while((var2 = var1.next()) != -1) {
  91.          if (this.getCharOrder(var2) == -1) {
  92.             String var3 = var1.decomposition();
  93.             if (var3.length() == 1) {
  94.                int var8 = this.getCharOrder(var3.charAt(0));
  95.                if (var8 != -1) {
  96.                   this.addOrder(var2, var8);
  97.                }
  98.             } else {
  99.                if (var3.length() == 2) {
  100.                   char var4 = var3.charAt(0);
  101.                   if (Character.isHighSurrogate(var4)) {
  102.                      int var9 = this.getCharOrder(var3.codePointAt(0));
  103.                      if (var9 != -1) {
  104.                         this.addOrder(var2, var9);
  105.                      }
  106.                      continue;
  107.                   }
  108.                }
  109.  
  110.                int var7 = this.getContractOrder(var3);
  111.                if (var7 != -1) {
  112.                   this.addOrder(var2, var7);
  113.                } else {
  114.                   boolean var5 = true;
  115.  
  116.                   for(int var6 = 0; var6 < var3.length(); ++var6) {
  117.                      if (this.getCharOrder(var3.charAt(var6)) == -1) {
  118.                         var5 = false;
  119.                         break;
  120.                      }
  121.                   }
  122.  
  123.                   if (var5) {
  124.                      this.addExpandOrder(var2, var3, -1);
  125.                   }
  126.                }
  127.             }
  128.          }
  129.       }
  130.  
  131.    }
  132.  
  133.    private final void commit() {
  134.       if (this.expandTable != null) {
  135.          for(int var1 = 0; var1 < this.expandTable.size(); ++var1) {
  136.             int[] var2 = (int[])this.expandTable.elementAt(var1);
  137.  
  138.             for(int var3 = 0; var3 < var2.length; ++var3) {
  139.                int var4 = var2[var3];
  140.                if (var4 < 2113929216 && var4 > 1879048192) {
  141.                   int var5 = var4 - 1879048192;
  142.                   int var6 = this.getCharOrder(var5);
  143.                   if (var6 == -1) {
  144.                      var2[var3] = '\uffff' & var5;
  145.                   } else {
  146.                      var2[var3] = var6;
  147.                   }
  148.                }
  149.             }
  150.          }
  151.       }
  152.  
  153.    }
  154.  
  155.    private final int increment(int var1, int var2) {
  156.       switch (var1) {
  157.          case 0:
  158.             var2 += 65536;
  159.             var2 &= -65536;
  160.             this.isOverIgnore = true;
  161.             break;
  162.          case 1:
  163.             var2 += 256;
  164.             var2 &= -256;
  165.             if (!this.isOverIgnore) {
  166.                ++this.maxSecOrder;
  167.             }
  168.             break;
  169.          case 2:
  170.             ++var2;
  171.             if (!this.isOverIgnore) {
  172.                ++this.maxTerOrder;
  173.             }
  174.       }
  175.  
  176.       return var2;
  177.    }
  178.  
  179.    private final void addOrder(int var1, int var2) {
  180.       int var3 = this.mapping.elementAt(var1);
  181.       if (var3 >= 2130706432) {
  182.          int var4 = 1;
  183.          if (Character.isSupplementaryCodePoint(var1)) {
  184.             var4 = Character.toChars(var1, this.keyBuf, 0);
  185.          } else {
  186.             this.keyBuf[0] = (char)var1;
  187.          }
  188.  
  189.          this.addContractOrder(new String(this.keyBuf, 0, var4), var2);
  190.       } else {
  191.          this.mapping.setElementAt(var1, var2);
  192.       }
  193.  
  194.    }
  195.  
  196.    private final void addContractOrder(String var1, int var2) {
  197.       this.addContractOrder(var1, var2, true);
  198.    }
  199.  
  200.    private final void addContractOrder(String var1, int var2, boolean var3) {
  201.       if (this.contractTable == null) {
  202.          this.contractTable = new Vector(20);
  203.       }
  204.  
  205.       int var4 = var1.codePointAt(0);
  206.       int var5 = this.mapping.elementAt(var4);
  207.       Vector var6 = this.getContractValuesImpl(var5 - 2130706432);
  208.       if (var6 == null) {
  209.          int var7 = 2130706432 + this.contractTable.size();
  210.          var6 = new Vector(20);
  211.          this.contractTable.addElement(var6);
  212.          var6.addElement(new EntryPair(var1.substring(0, Character.charCount(var4)), var5));
  213.          this.mapping.setElementAt(var4, var7);
  214.       }
  215.  
  216.       int var9 = RBCollationTables.getEntry(var6, var1, var3);
  217.       if (var9 != -1) {
  218.          EntryPair var8 = (EntryPair)var6.elementAt(var9);
  219.          var8.value = var2;
  220.       } else {
  221.          EntryPair var10 = (EntryPair)var6.lastElement();
  222.          if (var1.length() > var10.entryName.length()) {
  223.             var6.addElement(new EntryPair(var1, var2, var3));
  224.          } else {
  225.             var6.insertElementAt(new EntryPair(var1, var2, var3), var6.size() - 1);
  226.          }
  227.       }
  228.  
  229.       if (var3 && var1.length() > 1) {
  230.          this.addContractFlags(var1);
  231.          this.addContractOrder((new StringBuffer(var1)).reverse().toString(), var2, false);
  232.       }
  233.  
  234.    }
  235.  
  236.    private int getContractOrder(String var1) {
  237.       int var2 = -1;
  238.       if (this.contractTable != null) {
  239.          int var3 = var1.codePointAt(0);
  240.          Vector var4 = this.getContractValues(var3);
  241.          if (var4 != null) {
  242.             int var5 = RBCollationTables.getEntry(var4, var1, true);
  243.             if (var5 != -1) {
  244.                EntryPair var6 = (EntryPair)var4.elementAt(var5);
  245.                var2 = var6.value;
  246.             }
  247.          }
  248.       }
  249.  
  250.       return var2;
  251.    }
  252.  
  253.    private final int getCharOrder(int var1) {
  254.       int var2 = this.mapping.elementAt(var1);
  255.       if (var2 >= 2130706432) {
  256.          Vector var3 = this.getContractValuesImpl(var2 - 2130706432);
  257.          EntryPair var4 = (EntryPair)var3.firstElement();
  258.          var2 = var4.value;
  259.       }
  260.  
  261.       return var2;
  262.    }
  263.  
  264.    private Vector getContractValues(int var1) {
  265.       int var2 = this.mapping.elementAt(var1);
  266.       return this.getContractValuesImpl(var2 - 2130706432);
  267.    }
  268.  
  269.    private Vector getContractValuesImpl(int var1) {
  270.       return var1 >= 0 ? (Vector)this.contractTable.elementAt(var1) : null;
  271.    }
  272.  
  273.    private final void addExpandOrder(String var1, String var2, int var3) throws ParseException {
  274.       int var4 = this.addExpansion(var3, var2);
  275.       if (var1.length() > 1) {
  276.          char var5 = var1.charAt(0);
  277.          if (Character.isHighSurrogate(var5) && var1.length() == 2) {
  278.             char var6 = var1.charAt(1);
  279.             if (Character.isLowSurrogate(var6)) {
  280.                this.addOrder(Character.toCodePoint(var5, var6), var4);
  281.             }
  282.          } else {
  283.             this.addContractOrder(var1, var4);
  284.          }
  285.       } else {
  286.          this.addOrder(var1.charAt(0), var4);
  287.       }
  288.  
  289.    }
  290.  
  291.    private final void addExpandOrder(int var1, String var2, int var3) throws ParseException {
  292.       int var4 = this.addExpansion(var3, var2);
  293.       this.addOrder(var1, var4);
  294.    }
  295.  
  296.    private int addExpansion(int var1, String var2) {
  297.       if (this.expandTable == null) {
  298.          this.expandTable = new Vector(20);
  299.       }
  300.  
  301.       int var3 = var1 == -1 ? 0 : 1;
  302.       int[] var4 = new int[var2.length() + var3];
  303.       if (var3 == 1) {
  304.          var4[0] = var1;
  305.       }
  306.  
  307.       int var5 = var3;
  308.  
  309.       for(int var6 = 0; var6 < var2.length(); ++var6) {
  310.          char var7 = var2.charAt(var6);
  311.          int var9;
  312.          if (Character.isHighSurrogate(var7)) {
  313.             ++var6;
  314.             char var8;
  315.             if (var6 == var2.length() || !Character.isLowSurrogate(var8 = var2.charAt(var6))) {
  316.                break;
  317.             }
  318.  
  319.             var9 = Character.toCodePoint(var7, var8);
  320.          } else {
  321.             var9 = var7;
  322.          }
  323.  
  324.          int var10 = this.getCharOrder(var9);
  325.          if (var10 != -1) {
  326.             var4[var5++] = var10;
  327.          } else {
  328.             var4[var5++] = 1879048192 + var9;
  329.          }
  330.       }
  331.  
  332.       if (var5 < var4.length) {
  333.          int[] var11 = new int[var5];
  334.  
  335.          while(true) {
  336.             --var5;
  337.             if (var5 < 0) {
  338.                var4 = var11;
  339.                break;
  340.             }
  341.  
  342.             var11[var5] = var4[var5];
  343.          }
  344.       }
  345.  
  346.       int var12 = 2113929216 + this.expandTable.size();
  347.       this.expandTable.addElement(var4);
  348.       return var12;
  349.    }
  350.  
  351.    private void addContractFlags(String var1) {
  352.       int var4 = var1.length();
  353.  
  354.       for(int var5 = 0; var5 < var4; ++var5) {
  355.          char var2 = var1.charAt(var5);
  356.          int var10000;
  357.          if (Character.isHighSurrogate(var2)) {
  358.             ++var5;
  359.             var10000 = Character.toCodePoint(var2, var1.charAt(var5));
  360.          } else {
  361.             var10000 = var2;
  362.          }
  363.  
  364.          int var3 = var10000;
  365.          this.contractFlags.put(var3, 1);
  366.       }
  367.  
  368.    }
  369. }
  370.